package com.zjs.design;

/**
 * 静态代理模式
 *
 * 应用场景
 * 比如当我们使用别人的代码的时候，可以通过代理，对方法增强，避免了修改别人的代码。Spring AOP。
 *
 * 优缺点
 * 职责清晰了，高扩展性，智能化。但由于多了一个代理对象，可能会使请求的处理速度变慢，有些代理的实现较为复杂。
 * @author zhu_jinsheng
 * @version 1.0
 * @date 2020/7/4 17:44
 */
public class ProxyPatternOfStaticProxy {
    public static void main(String[] args){
        Subject proxy = new ProxySubject(new RealSubject());
        proxy.request();
    }
}

/**
 * 代理类和真实类的公用接口
 */
interface Subject {
    void request();
}

/**
 * 真实类的请求
 */
class RealSubject implements Subject{
    @Override
    public void request() {
        System.out.println("真实请求");
    }
}

/**
 * 代理请求，引入了真实类对象，对方法进行了增强
 */
class ProxySubject implements Subject{

    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
        System.out.println("代理请求");
    }
}